http://r-statistics.co/Complete-Ggplot2-Tutorial-Part2-Customizing-Theme-With-R-Code.html
This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter. You can also use the green “play” button on the top right of the chunk.
library(tidyverse)
## -- Attaching packages ---------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.2.0 v purrr 0.3.2
## v tibble 2.1.3 v dplyr 0.8.3
## v tidyr 1.0.0 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## -- Conflicts ------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
load("data/crime_data_stat.rda")
crime_data_stat <- crime_data_stat %>% ungroup()
DT::datatable(crime_data_stat)
skimr::skim(crime_data_stat)
We’re going to start working with a basic visualization.
library(ggplot2)
ggplot(crime_data_stat) +
aes(x = crime_yearmonth, y= count, group=offense_category,
color = offense_category) +
geom_line()
While this visualization might be good for exploratory purposes, for explanatory purposes, it is a little too complicated to communicate one finding about the data.
Let’s save our plot into an R object called a ggplot. We’ll use the <- to assign it to the variable called my_plot:
my_plot <-
ggplot(crime_data_stat) +
aes(x = crime_yearmonth, y= count, group=offense_category,
color = offense_category) +
geom_line()
Now, when we want to modify our plot, we can use my_plot. More on this below.
Before you move on, discuss with your partner:
The neat thing about ggplot2 is that you can modify the plot code by adding modifiers with the + (plus) sign.
We’re going to take a “paper doll” approach to our plot to modifying it - each modifier can be thought of as a set of “clothes” that we dress our plot in.
The defaults for the plot are decent, but have some distracting elements. We can declutter our plot by removing some of these distracting elements.
Before you move on, discuss:
A lot of the simplification can come from built in themes. Adding theme_minimal() will remove a lot of the background elements. Try it out and compare it with the above plot.
my_plot + theme_minimal()
If you have time, try these other themes out:
#paste the "+" at the end of your statement
+
theme_bw()
+
theme_void()
theme()We can customize our plot even further by adding a theme() function to the end of our plot. We’ll use this to remove individual elements from the plot.
theme() looks very intimidating, because it has lots of different arguments. We’ll only look at a few of these:
axis.title, axis.title.x and axis.title.y (The labels for the axes)panel.grid (grid lines)legend.position (Placing the legend, including removing it)How will we remove these elements? We will specify an element called element_blank() to these arguments. What is this? Think of it as a special placeholder that says we don’t want to see this element.
Let’s try simplifying our plot by removing the x-axis text. By context, the label crime_yearmonth isn’t that helpful.
my_plot +
theme(axis.title.x = element_blank())
Try removing the legend. Hmm, it is more simplified, but we have lost all the information about the categories! We can add that information back with the use of color in the next section.
my_plot +
theme(legend.position = "none")
Try removing the gridlines:
my_plot +
theme(panel.grid = element_blank())
Play with different combinations of these different theme() statements to customize your plot.
my_plot +
theme_minimal() +
theme(axis.title.x = element_blank()) +
theme(panel.grid = element_blank()) +
theme(legend.position = "none")
Another way we can guide people through our visualization is by using annotations, which can be very helpful.
labs()geom_hline() and geom_vline()annotate()Before you move on, discuss:
# crime_data_stat %>%
# mutate(motor_theft =
# ifelse(offense_category ==
# "Motor Vehicle Theft", "Y", "N")) %>%
# ggplot(aes(x = crime_yearmonth, y= count,
# group=offense_category, color = motor_theft)) +
# geom_line() +
# scale_color_manual(values=c("Y"="blue", "N"="darkgrey")) +
# theme_minimal() +
# theme(legend.position = "none")
my_plot +
labs(title = "Auto Crimes are Levelling Off Compared to Other Crimes",x="Year", y="Number of Crimes")
Using geom_hline() to show the average value across a time period can provide a useful reference for viewers:
# crime_stat %>%
# ungroup(offense_category) %>%
# ggplot(aes(x = crime_yearmonth, y= count,
# group=offense_category, fill = motor_theft)) +
# geom_bar(stat = "identity", color="black") +
# scale_fill_manual(values=c("Y"="blue", "N"="grey")) +
# theme_minimal() +
# theme(legend.position = "none") +
# labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year", y="Number of Crimes") +
crime_stat <- crime_data_stat %>%
mutate(motor_theft =
ifelse(offense_category ==
"Motor Vehicle Theft", "Y", "N"),
mean_count=mean(count))
mean_c <- crime_stat$mean_count[1]
my_plot +
annotate("text", x = as.Date("2016-03-01"), y=600, label="Mean\n Crime") +
geom_hline(yintercept = mean_c, lty=3)
Adding text annotations directly to the graph can be extremely helpful, especially if there is a point of interest you want users to look at. (For adding text information per data point, look at geom_text() and geom_repel() from the ggrepel package).
The first argument to annotate() is “text”, and it takes x and y arguments to determine the position of our annotation. Since our x axis is a Date, we need to specify the x coordinate in terms of Dates.
Try adjusting the y argument to get the annotation more centered around the mean line.
# crime_stat %>%
# ungroup(offense_category) %>%
# ggplot(aes(x = crime_yearmonth, y= count,
# group=offense_category, fill = motor_theft)) +
# geom_bar(stat = "identity", color="black") +
# scale_fill_manual(values=c("Y"="blue", "N"="grey")) +
# theme_minimal() +
# theme(legend.position = "none") +
# labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year", y="Number of Crimes") +
my_plot +
annotate(geom = "text",
x = as.Date("2016-03-01"), y=600,
label="Mean Automotive\n Thefts") +
geom_hline(yintercept = mean_c, lty=3)
# crime_stat %>%
# ungroup(offense_category) %>%
# ggplot(aes(x = crime_yearmonth, y= count,
# group=offense_category, color = motor_theft)) +
# geom_line() +
# scale_color_manual(values=c("Y"="darkorange", "N"="grey")) +
# theme_minimal() +
# theme(panel.grid = element_blank()) +
# theme(legend.position = "none")
my_plot +
labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year", y="Number of Crimes") +
annotate("text", x = as.Date("2018-03-01"), y=650, label="Mean\n Crime") +
geom_hline(yintercept = mean_c, lty=3)
Experiment with the following modifications to the graph. If you have time, cut and paste the modifications you decided on in part 2 to your graph.
my_plot +
labs(title = "Auto Crimes are Levelling Off Compared to Other Crimes",x="Year", y="Number of Crimes") +
annotate("text", x = as.Date("2018-03-01"), y=650, label="Mean\n Crime") +
geom_hline(yintercept = mean_c, lty=3)
What if we only want to highlight one group in the data?
Before you move on, discuss:
We can manually color a single group in our data through a two step process. For example, if we want to highlight “Motor Vehicle Theft” but not the others we can:
motor_theft by recoding the offense_category variable to have Y for Motor Vehicle Theft and N for the other categoriesscale_color_manual() by specifying a values argument.We can add a new variable using what is called a mutate() function. It lets us calculate a new variable, based on the other values of the variable. If you’ve used Excel’s IF() function, it’s very similar in terms of the syntax. We first provide a condition:
ifelse(offense_category == "Motor Vehicle Theft",
yes = "Y", no = "N")
The ifelse() function can be read:
If the value for
offense_categoryis “Motor Vehicle Theft” THEN recode that value as “Y”, If it doesn’t equal “Motor Vehicle Theft”, THEN recode that value as “N”
Run the code below and explore the table a little bit to confirm that “Motor Vehicle Theft” crimes are coded as Y in our new variable, motor_theft:
crime_stat <- crime_data_stat %>%
mutate(motor_theft =
ifelse(offense_category == "Motor Vehicle Theft",
yes = "Y", no = "N"))
DT::datatable(crime_stat)
scale_color_manual() to color our new variableNow we have our new variable called motor_theft, we need to map the Y and N values to actual colors. We can do this by using the scale_color_manual() function, which lets us map values to specific colors by using the values argument.
#put your final plot here
library(tidyverse)
ggplot(crime_stat, aes(x = crime_yearmonth, y= count, group=offense_category, color = motor_theft)) +
geom_line() + scale_color_manual(values=c("Y"="blue", "N"="grey"))
Try using different colors to contrast the motor_theft line. A small list of color names in R can be found here: https://www.r-graph-gallery.com/42-colors-names.html
If you want all of the color names (there are a lot of them!) you can run this code block:
colors()
## [1] "white" "aliceblue" "antiquewhite"
## [4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
## [7] "antiquewhite4" "aquamarine" "aquamarine1"
## [10] "aquamarine2" "aquamarine3" "aquamarine4"
## [13] "azure" "azure1" "azure2"
## [16] "azure3" "azure4" "beige"
## [19] "bisque" "bisque1" "bisque2"
## [22] "bisque3" "bisque4" "black"
## [25] "blanchedalmond" "blue" "blue1"
## [28] "blue2" "blue3" "blue4"
## [31] "blueviolet" "brown" "brown1"
## [34] "brown2" "brown3" "brown4"
## [37] "burlywood" "burlywood1" "burlywood2"
## [40] "burlywood3" "burlywood4" "cadetblue"
## [43] "cadetblue1" "cadetblue2" "cadetblue3"
## [46] "cadetblue4" "chartreuse" "chartreuse1"
## [49] "chartreuse2" "chartreuse3" "chartreuse4"
## [52] "chocolate" "chocolate1" "chocolate2"
## [55] "chocolate3" "chocolate4" "coral"
## [58] "coral1" "coral2" "coral3"
## [61] "coral4" "cornflowerblue" "cornsilk"
## [64] "cornsilk1" "cornsilk2" "cornsilk3"
## [67] "cornsilk4" "cyan" "cyan1"
## [70] "cyan2" "cyan3" "cyan4"
## [73] "darkblue" "darkcyan" "darkgoldenrod"
## [76] "darkgoldenrod1" "darkgoldenrod2" "darkgoldenrod3"
## [79] "darkgoldenrod4" "darkgray" "darkgreen"
## [82] "darkgrey" "darkkhaki" "darkmagenta"
## [85] "darkolivegreen" "darkolivegreen1" "darkolivegreen2"
## [88] "darkolivegreen3" "darkolivegreen4" "darkorange"
## [91] "darkorange1" "darkorange2" "darkorange3"
## [94] "darkorange4" "darkorchid" "darkorchid1"
## [97] "darkorchid2" "darkorchid3" "darkorchid4"
## [100] "darkred" "darksalmon" "darkseagreen"
## [103] "darkseagreen1" "darkseagreen2" "darkseagreen3"
## [106] "darkseagreen4" "darkslateblue" "darkslategray"
## [109] "darkslategray1" "darkslategray2" "darkslategray3"
## [112] "darkslategray4" "darkslategrey" "darkturquoise"
## [115] "darkviolet" "deeppink" "deeppink1"
## [118] "deeppink2" "deeppink3" "deeppink4"
## [121] "deepskyblue" "deepskyblue1" "deepskyblue2"
## [124] "deepskyblue3" "deepskyblue4" "dimgray"
## [127] "dimgrey" "dodgerblue" "dodgerblue1"
## [130] "dodgerblue2" "dodgerblue3" "dodgerblue4"
## [133] "firebrick" "firebrick1" "firebrick2"
## [136] "firebrick3" "firebrick4" "floralwhite"
## [139] "forestgreen" "gainsboro" "ghostwhite"
## [142] "gold" "gold1" "gold2"
## [145] "gold3" "gold4" "goldenrod"
## [148] "goldenrod1" "goldenrod2" "goldenrod3"
## [151] "goldenrod4" "gray" "gray0"
## [154] "gray1" "gray2" "gray3"
## [157] "gray4" "gray5" "gray6"
## [160] "gray7" "gray8" "gray9"
## [163] "gray10" "gray11" "gray12"
## [166] "gray13" "gray14" "gray15"
## [169] "gray16" "gray17" "gray18"
## [172] "gray19" "gray20" "gray21"
## [175] "gray22" "gray23" "gray24"
## [178] "gray25" "gray26" "gray27"
## [181] "gray28" "gray29" "gray30"
## [184] "gray31" "gray32" "gray33"
## [187] "gray34" "gray35" "gray36"
## [190] "gray37" "gray38" "gray39"
## [193] "gray40" "gray41" "gray42"
## [196] "gray43" "gray44" "gray45"
## [199] "gray46" "gray47" "gray48"
## [202] "gray49" "gray50" "gray51"
## [205] "gray52" "gray53" "gray54"
## [208] "gray55" "gray56" "gray57"
## [211] "gray58" "gray59" "gray60"
## [214] "gray61" "gray62" "gray63"
## [217] "gray64" "gray65" "gray66"
## [220] "gray67" "gray68" "gray69"
## [223] "gray70" "gray71" "gray72"
## [226] "gray73" "gray74" "gray75"
## [229] "gray76" "gray77" "gray78"
## [232] "gray79" "gray80" "gray81"
## [235] "gray82" "gray83" "gray84"
## [238] "gray85" "gray86" "gray87"
## [241] "gray88" "gray89" "gray90"
## [244] "gray91" "gray92" "gray93"
## [247] "gray94" "gray95" "gray96"
## [250] "gray97" "gray98" "gray99"
## [253] "gray100" "green" "green1"
## [256] "green2" "green3" "green4"
## [259] "greenyellow" "grey" "grey0"
## [262] "grey1" "grey2" "grey3"
## [265] "grey4" "grey5" "grey6"
## [268] "grey7" "grey8" "grey9"
## [271] "grey10" "grey11" "grey12"
## [274] "grey13" "grey14" "grey15"
## [277] "grey16" "grey17" "grey18"
## [280] "grey19" "grey20" "grey21"
## [283] "grey22" "grey23" "grey24"
## [286] "grey25" "grey26" "grey27"
## [289] "grey28" "grey29" "grey30"
## [292] "grey31" "grey32" "grey33"
## [295] "grey34" "grey35" "grey36"
## [298] "grey37" "grey38" "grey39"
## [301] "grey40" "grey41" "grey42"
## [304] "grey43" "grey44" "grey45"
## [307] "grey46" "grey47" "grey48"
## [310] "grey49" "grey50" "grey51"
## [313] "grey52" "grey53" "grey54"
## [316] "grey55" "grey56" "grey57"
## [319] "grey58" "grey59" "grey60"
## [322] "grey61" "grey62" "grey63"
## [325] "grey64" "grey65" "grey66"
## [328] "grey67" "grey68" "grey69"
## [331] "grey70" "grey71" "grey72"
## [334] "grey73" "grey74" "grey75"
## [337] "grey76" "grey77" "grey78"
## [340] "grey79" "grey80" "grey81"
## [343] "grey82" "grey83" "grey84"
## [346] "grey85" "grey86" "grey87"
## [349] "grey88" "grey89" "grey90"
## [352] "grey91" "grey92" "grey93"
## [355] "grey94" "grey95" "grey96"
## [358] "grey97" "grey98" "grey99"
## [361] "grey100" "honeydew" "honeydew1"
## [364] "honeydew2" "honeydew3" "honeydew4"
## [367] "hotpink" "hotpink1" "hotpink2"
## [370] "hotpink3" "hotpink4" "indianred"
## [373] "indianred1" "indianred2" "indianred3"
## [376] "indianred4" "ivory" "ivory1"
## [379] "ivory2" "ivory3" "ivory4"
## [382] "khaki" "khaki1" "khaki2"
## [385] "khaki3" "khaki4" "lavender"
## [388] "lavenderblush" "lavenderblush1" "lavenderblush2"
## [391] "lavenderblush3" "lavenderblush4" "lawngreen"
## [394] "lemonchiffon" "lemonchiffon1" "lemonchiffon2"
## [397] "lemonchiffon3" "lemonchiffon4" "lightblue"
## [400] "lightblue1" "lightblue2" "lightblue3"
## [403] "lightblue4" "lightcoral" "lightcyan"
## [406] "lightcyan1" "lightcyan2" "lightcyan3"
## [409] "lightcyan4" "lightgoldenrod" "lightgoldenrod1"
## [412] "lightgoldenrod2" "lightgoldenrod3" "lightgoldenrod4"
## [415] "lightgoldenrodyellow" "lightgray" "lightgreen"
## [418] "lightgrey" "lightpink" "lightpink1"
## [421] "lightpink2" "lightpink3" "lightpink4"
## [424] "lightsalmon" "lightsalmon1" "lightsalmon2"
## [427] "lightsalmon3" "lightsalmon4" "lightseagreen"
## [430] "lightskyblue" "lightskyblue1" "lightskyblue2"
## [433] "lightskyblue3" "lightskyblue4" "lightslateblue"
## [436] "lightslategray" "lightslategrey" "lightsteelblue"
## [439] "lightsteelblue1" "lightsteelblue2" "lightsteelblue3"
## [442] "lightsteelblue4" "lightyellow" "lightyellow1"
## [445] "lightyellow2" "lightyellow3" "lightyellow4"
## [448] "limegreen" "linen" "magenta"
## [451] "magenta1" "magenta2" "magenta3"
## [454] "magenta4" "maroon" "maroon1"
## [457] "maroon2" "maroon3" "maroon4"
## [460] "mediumaquamarine" "mediumblue" "mediumorchid"
## [463] "mediumorchid1" "mediumorchid2" "mediumorchid3"
## [466] "mediumorchid4" "mediumpurple" "mediumpurple1"
## [469] "mediumpurple2" "mediumpurple3" "mediumpurple4"
## [472] "mediumseagreen" "mediumslateblue" "mediumspringgreen"
## [475] "mediumturquoise" "mediumvioletred" "midnightblue"
## [478] "mintcream" "mistyrose" "mistyrose1"
## [481] "mistyrose2" "mistyrose3" "mistyrose4"
## [484] "moccasin" "navajowhite" "navajowhite1"
## [487] "navajowhite2" "navajowhite3" "navajowhite4"
## [490] "navy" "navyblue" "oldlace"
## [493] "olivedrab" "olivedrab1" "olivedrab2"
## [496] "olivedrab3" "olivedrab4" "orange"
## [499] "orange1" "orange2" "orange3"
## [502] "orange4" "orangered" "orangered1"
## [505] "orangered2" "orangered3" "orangered4"
## [508] "orchid" "orchid1" "orchid2"
## [511] "orchid3" "orchid4" "palegoldenrod"
## [514] "palegreen" "palegreen1" "palegreen2"
## [517] "palegreen3" "palegreen4" "paleturquoise"
## [520] "paleturquoise1" "paleturquoise2" "paleturquoise3"
## [523] "paleturquoise4" "palevioletred" "palevioletred1"
## [526] "palevioletred2" "palevioletred3" "palevioletred4"
## [529] "papayawhip" "peachpuff" "peachpuff1"
## [532] "peachpuff2" "peachpuff3" "peachpuff4"
## [535] "peru" "pink" "pink1"
## [538] "pink2" "pink3" "pink4"
## [541] "plum" "plum1" "plum2"
## [544] "plum3" "plum4" "powderblue"
## [547] "purple" "purple1" "purple2"
## [550] "purple3" "purple4" "red"
## [553] "red1" "red2" "red3"
## [556] "red4" "rosybrown" "rosybrown1"
## [559] "rosybrown2" "rosybrown3" "rosybrown4"
## [562] "royalblue" "royalblue1" "royalblue2"
## [565] "royalblue3" "royalblue4" "saddlebrown"
## [568] "salmon" "salmon1" "salmon2"
## [571] "salmon3" "salmon4" "sandybrown"
## [574] "seagreen" "seagreen1" "seagreen2"
## [577] "seagreen3" "seagreen4" "seashell"
## [580] "seashell1" "seashell2" "seashell3"
## [583] "seashell4" "sienna" "sienna1"
## [586] "sienna2" "sienna3" "sienna4"
## [589] "skyblue" "skyblue1" "skyblue2"
## [592] "skyblue3" "skyblue4" "slateblue"
## [595] "slateblue1" "slateblue2" "slateblue3"
## [598] "slateblue4" "slategray" "slategray1"
## [601] "slategray2" "slategray3" "slategray4"
## [604] "slategrey" "snow" "snow1"
## [607] "snow2" "snow3" "snow4"
## [610] "springgreen" "springgreen1" "springgreen2"
## [613] "springgreen3" "springgreen4" "steelblue"
## [616] "steelblue1" "steelblue2" "steelblue3"
## [619] "steelblue4" "tan" "tan1"
## [622] "tan2" "tan3" "tan4"
## [625] "thistle" "thistle1" "thistle2"
## [628] "thistle3" "thistle4" "tomato"
## [631] "tomato1" "tomato2" "tomato3"
## [634] "tomato4" "turquoise" "turquoise1"
## [637] "turquoise2" "turquoise3" "turquoise4"
## [640] "violet" "violetred" "violetred1"
## [643] "violetred2" "violetred3" "violetred4"
## [646] "wheat" "wheat1" "wheat2"
## [649] "wheat3" "wheat4" "whitesmoke"
## [652] "yellow" "yellow1" "yellow2"
## [655] "yellow3" "yellow4" "yellowgreen"
library(tidyverse)
my_new_plot <- ggplot(crime_stat, aes(x = crime_yearmonth, y= count, group=offense_category, color = motor_theft)) +
geom_line()
my_new_plot +
scale_color_manual(values=c("Y"="blue", "N"="grey"))
Cut and paste all your modifiers and make your final figure below!
my_new_plot +
What if we wanted to highlight a specific time period in our dataset? We can actually subset the data
We want to specify this criteria in our filter() statement:
crime_subset <- crime_stat %>%
filter(crime_yearmonth >= "2017-01-01") %>%
filter(crime_yearmonth <= "2018-01-01")
Now we can use this dataset to highlight this portion of the data:
crime_stat %>% ggplot(aes(x = crime_yearmonth, y= count, group=offense_category)) +
geom_line(color = "grey") +
geom_line(data = crime_subset, color = "blue") +
geom_vline(xintercept = as.Date("2017-01-01"), color="blue", lty=3) +
geom_vline(xintercept = as.Date("2018-01-01"), color="blue", lty=3) +
annotate("text", x=as.Date("2017-06-01"), y= 1200, label= "Time period\n of Interest", color="blue") +
labs(title = "Motor Thefts in 2017-2018 are flat") +
theme_minimal() +
theme(axis.title.x = element_blank()) +
theme(panel.grid = element_blank())
What if we wanted to show only the “Motor Vehicle Theft” category in blue? Then we can add an additional filter() statement in our subset:
crime_subset <- crime_stat %>%
filter(crime_yearmonth >= "2017-01-01") %>%
filter(crime_yearmonth <= "2018-01-01") %>%
filter(offense_category ==
"Motor Vehicle Theft")
crime_stat %>% ggplot(aes(x = crime_yearmonth, y= count, group=offense_category)) +
geom_line(color = "grey") +
geom_line(data = crime_subset, color = "blue") +
geom_vline(xintercept = as.Date("2017-01-01"), color="blue", lty=3) +
geom_vline(xintercept = as.Date("2018-01-01"), color="blue", lty=3) +
annotate("text", x=as.Date("2017-06-01"), y= 1200, label= "Time period\n of Interest") +
labs(title = "Crimes in 2017-2018 are flat") +
theme_minimal() +
theme(axis.title.x = element_blank()) +
theme(panel.grid = element_blank())
We can use ggsave() to save our plot.
ggsave("timeplot.pdf")
plotlyplotly is a JavaScript library that allows you to make plots that are interactive on a webpage. Mousing over traces can reveal what’s called a tooltip - additional information about that datapoint that you can specify
Once the plots are built, they don’t require R to run, so they can be hosted on a site for static webpages.
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
crime_stat <- crime_data_stat %>%
mutate(motor_theft =
ifelse(offense_category ==
"Motor Vehicle Theft", "Y", "N"),
mean_count=mean(count))
mean_c <- crime_stat$mean_count[1]
my_plot <- crime_stat %>%
ungroup(offense_category) %>%
ggplot(aes(x = crime_yearmonth, y= count,
group=offense_category, color = motor_theft)) +
geom_line() +
scale_color_manual(values=c("Y"="blue", "N"="grey")) +
theme_minimal() +
theme(panel.grid = element_blank()) +
theme(legend.position = "none") +
labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year/Month", y="Number of Crimes") +
annotate("text", x = as.Date("2016-03-01"), y=600, label="Mean\n Crime") +
geom_hline(yintercept = mean_c, lty=3)
ggplotly(my_plot)
Try